Dane o materiałach stosowanych do produkcji baterii pozwalają na uzyskanie interesujących wniosków. Wartości udziału atomowego składników w stanie rozładowanym i pojemności grawimetrycznej, a także średniego napięcia dla poszczególnego kroku napięcia i gęstości energii w odniesieniu do masy baterii wykazują stosunkowo dużą korelacje, co może być interesującym kierunkiem dla nowych badań. Wsród najważniejszych trendów w badaniach nad bateriami można wyróżnić zastosowanie jako głównego jonu odpowiadającego za transport ładunku litu, rzadziej wapnia lub magnezu. Częste jest również używanie w materiałach tlenu. Zbiór danych pozwala na skuteczną predykcję parametrów nowych materiałów z wykorzystaniem technik uczenia maszynowego.
library(dplyr)
library(ggplot2)
library(tidyr)
library(plotly)
library(knitr)
library(caret)
library(randomForest)
data <- read.csv("mp_batteries.csv")
columns <- names(data)
string_columns <- c("Battery.Formula", "Working.Ion", "Formula.Charge", "Formula.Discharge")
numeric_columns <- setdiff(columns, c(string_columns, "Battery.ID"))
Liczba wierszy: 4351.
Podsumowanie:
kable(summary(data))
| Battery.ID | Battery.Formula | Working.Ion | Formula.Charge | Formula.Discharge | Max.Delta.Volume | Average.Voltage | Gravimetric.Capacity | Volumetric.Capacity | Gravimetric.Energy | Volumetric.Energy | Atomic.Fraction.Charge | Atomic.Fraction.Discharge | Stability.Charge | Stability.Discharge | Steps | Max.Voltage.Step | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Length:4351 | Length:4351 | Length:4351 | Length:4351 | Length:4351 | Min. : 0.00002 | Min. :-7.755 | Min. : 5.176 | Min. : 24.08 | Min. :-583.5 | Min. :-2208.1 | Min. :0.00000 | Min. :0.007407 | Min. :0.00000 | Min. :0.00000 | Min. :1.000 | Min. : 0.0000 | |
| Class :character | Class :character | Class :character | Class :character | Class :character | 1st Qu.: 0.01747 | 1st Qu.: 2.226 | 1st Qu.: 88.108 | 1st Qu.: 311.62 | 1st Qu.: 211.7 | 1st Qu.: 821.6 | 1st Qu.:0.00000 | 1st Qu.:0.086957 | 1st Qu.:0.03301 | 1st Qu.:0.01952 | 1st Qu.:1.000 | 1st Qu.: 0.0000 | |
| Mode :character | Mode :character | Mode :character | Mode :character | Mode :character | Median : 0.04203 | Median : 3.301 | Median : 130.691 | Median : 507.03 | Median : 401.8 | Median : 1463.8 | Median :0.00000 | Median :0.142857 | Median :0.07319 | Median :0.04878 | Median :1.000 | Median : 0.0000 | |
| NA | NA | NA | NA | NA | Mean : 0.37531 | Mean : 3.083 | Mean : 158.291 | Mean : 610.62 | Mean : 444.1 | Mean : 1664.0 | Mean :0.03986 | Mean :0.159077 | Mean :0.14257 | Mean :0.12207 | Mean :1.167 | Mean : 0.1503 | |
| NA | NA | NA | NA | NA | 3rd Qu.: 0.08595 | 3rd Qu.: 4.019 | 3rd Qu.: 187.600 | 3rd Qu.: 722.75 | 3rd Qu.: 614.4 | 3rd Qu.: 2252.3 | 3rd Qu.:0.04762 | 3rd Qu.:0.200000 | 3rd Qu.:0.13160 | 3rd Qu.:0.09299 | 3rd Qu.:1.000 | 3rd Qu.: 0.0000 | |
| NA | NA | NA | NA | NA | Max. :293.19322 | Max. :54.569 | Max. :2557.627 | Max. :7619.19 | Max. :5926.9 | Max. :18305.9 | Max. :0.90909 | Max. :0.993333 | Max. :6.48710 | Max. :6.27781 | Max. :6.000 | Max. :26.9607 |
| Value | Count |
|---|---|
| Li0-1V2OF5 | 19 |
| Li0-1CoPO4 | 18 |
| Li0-1FePO4 | 18 |
| Li0-3MnFeCo(PO4)3 | 17 |
| Li0-1MnPO4 | 15 |
| Li0-1V4OF11 | 15 |
| Li0-1V4O5F7 | 12 |
| Li0-1VF5 | 12 |
| Li0-1CrP2O7 | 11 |
| Li0-2MnP2O7 | 11 |
| Value | Count |
|---|---|
| Li | 2440 |
| Ca | 435 |
| Mg | 423 |
| Zn | 366 |
| Na | 309 |
| K | 107 |
| Al | 95 |
| Y | 93 |
| Rb | 50 |
| Cs | 33 |
| Value | Count |
|---|---|
| MnO2 | 49 |
| TiO2 | 47 |
| VO2 | 46 |
| CrO2 | 45 |
| CoO2 | 43 |
| NiO2 | 41 |
| FeO2 | 36 |
| FePO4 | 26 |
| WO2 | 25 |
| CoPO4 | 24 |
| Value | Count |
|---|---|
| LiCoPO4 | 19 |
| LiFePO4 | 19 |
| LiMnPO4 | 19 |
| LiV2OF5 | 19 |
| Li5Mn6(BO3)6 | 18 |
| Li3MnFeCo(PO4)3 | 17 |
| LiV4OF11 | 15 |
| Li2MnP2O7 | 14 |
| Li2FeSiO4 | 13 |
| LiCrPO4 | 12 |
| Value | Count |
|---|---|
| mp-1001925_Mg | 1 |
| mp-1003319_Ca | 1 |
| mp-10033_Cs | 1 |
| mp-10033_Rb | 1 |
| mp-1008911_Li | 1 |
| mp-1009555_Li | 1 |
| mp-1009747_Li | 1 |
| mp-1009747_Na | 1 |
| mp-1012668_Li | 1 |
| mp-1012678_Na | 1 |
Battery.ID to idenryfikator baterii. Jest on unikalny w zbiorze. Zmienne Battery.Formula, Formula.Charge i Formula.Discharge cechują się dużą liczbą różnych wartości. Oznacza to że testowane jest wiele różnych możliwych subastancji, które mogą zostać użyte do produkcji baterii. Inaczej jest w przypadku zmiennej Working.Ion. Ponad połowa materiałów jako głównego jonu używa litu. Wydaje się to być dominujący trend w badaniach nad bateriami.
nan_counts <- sapply(numeric_columns, function(col) sum(is.nan(data[[col]])))
nan_counts_df <- data.frame(
nan = nan_counts
)
print(kable(nan_counts_df))
| nan | |
|---|---|
| Max.Delta.Volume | 0 |
| Average.Voltage | 0 |
| Gravimetric.Capacity | 0 |
| Volumetric.Capacity | 0 |
| Gravimetric.Energy | 0 |
| Volumetric.Energy | 0 |
| Atomic.Fraction.Charge | 0 |
| Atomic.Fraction.Discharge | 0 |
| Stability.Charge | 0 |
| Stability.Discharge | 0 |
| Steps | 0 |
| Max.Voltage.Step | 0 |
W zbiorze danych nie brakuje żadnych wartości. Rozkłady większości zmiennych mają wyraźnie zaznaczony najczęściej występujący przedział wartości. Z reguły jest on dość wąski w stosunku do całej dziedziny.
numeric_df <- data[, numeric_columns]
correlation_matrix <- cor(numeric_df)
correlation_df <- as.data.frame(as.table(correlation_matrix))
names(correlation_df) <- c("x", "y", "cor")
correlation_df_one_dir <- correlation_df[as.character(correlation_df$x) < as.character(correlation_df$y), ]
correlation_df_sorted <- correlation_df_one_dir[order(-abs(correlation_df_one_dir$cor)), ] %>%
slice(1:length(correlation_df_one_dir$cor))
kable(correlation_df_sorted)
| x | y | cor |
|---|---|---|
| Gravimetric.Energy | Volumetric.Energy | 0.9283253 |
| Gravimetric.Capacity | Volumetric.Capacity | 0.8584163 |
| Stability.Charge | Stability.Discharge | 0.8028701 |
| Atomic.Fraction.Discharge | Gravimetric.Capacity | 0.6807716 |
| Average.Voltage | Gravimetric.Energy | 0.6656523 |
| Atomic.Fraction.Discharge | Volumetric.Capacity | 0.6180186 |
| Atomic.Fraction.Charge | Atomic.Fraction.Discharge | 0.5974157 |
| Average.Voltage | Volumetric.Energy | 0.5545191 |
| Max.Voltage.Step | Steps | 0.5352539 |
| Gravimetric.Capacity | Max.Delta.Volume | 0.4337733 |
| Gravimetric.Energy | Max.Voltage.Step | 0.3292322 |
| Volumetric.Capacity | Volumetric.Energy | 0.3257482 |
| Gravimetric.Energy | Steps | 0.2946075 |
| Atomic.Fraction.Discharge | Max.Delta.Volume | 0.2906921 |
| Max.Voltage.Step | Volumetric.Energy | 0.2526625 |
| Max.Delta.Volume | Volumetric.Capacity | 0.2424769 |
| Steps | Volumetric.Energy | 0.2381420 |
| Gravimetric.Capacity | Volumetric.Energy | 0.2304216 |
| Gravimetric.Capacity | Gravimetric.Energy | 0.2132463 |
| Average.Voltage | Volumetric.Capacity | -0.2128178 |
| Gravimetric.Energy | Volumetric.Capacity | 0.2098406 |
| Stability.Charge | Volumetric.Energy | 0.1783271 |
| Atomic.Fraction.Discharge | Average.Voltage | -0.1716903 |
| Gravimetric.Energy | Stability.Charge | 0.1669819 |
| Average.Voltage | Stability.Charge | 0.1661371 |
| Atomic.Fraction.Discharge | Steps | 0.1641713 |
| Atomic.Fraction.Charge | Volumetric.Energy | -0.1473523 |
| Average.Voltage | Gravimetric.Capacity | -0.1462222 |
| Gravimetric.Capacity | Steps | 0.1333977 |
| Atomic.Fraction.Charge | Gravimetric.Capacity | 0.1289210 |
| Average.Voltage | Stability.Discharge | -0.1284568 |
| Average.Voltage | Max.Voltage.Step | 0.1271208 |
| Steps | Volumetric.Capacity | 0.1037051 |
| Atomic.Fraction.Discharge | Max.Voltage.Step | 0.1019796 |
| Stability.Charge | Volumetric.Capacity | 0.1015305 |
| Atomic.Fraction.Charge | Gravimetric.Energy | -0.0972924 |
| Gravimetric.Capacity | Max.Voltage.Step | 0.0951906 |
| Max.Voltage.Step | Stability.Charge | 0.0940466 |
| Average.Voltage | Max.Delta.Volume | -0.0823707 |
| Gravimetric.Energy | Stability.Discharge | -0.0782609 |
| Atomic.Fraction.Discharge | Gravimetric.Energy | 0.0645248 |
| Gravimetric.Capacity | Stability.Charge | 0.0633871 |
| Stability.Discharge | Steps | -0.0631686 |
| Average.Voltage | Steps | 0.0627851 |
| Max.Voltage.Step | Volumetric.Capacity | 0.0626085 |
| Atomic.Fraction.Discharge | Volumetric.Energy | 0.0610586 |
| Gravimetric.Energy | Max.Delta.Volume | -0.0609858 |
| Stability.Discharge | Volumetric.Energy | -0.0599949 |
| Max.Delta.Volume | Volumetric.Energy | -0.0588321 |
| Atomic.Fraction.Charge | Stability.Discharge | -0.0523971 |
| Atomic.Fraction.Charge | Average.Voltage | -0.0385556 |
| Stability.Charge | Steps | -0.0374860 |
| Max.Delta.Volume | Stability.Charge | 0.0337587 |
| Atomic.Fraction.Discharge | Stability.Charge | 0.0324051 |
| Stability.Discharge | Volumetric.Capacity | 0.0317012 |
| Atomic.Fraction.Charge | Steps | 0.0297369 |
| Atomic.Fraction.Charge | Stability.Charge | -0.0273571 |
| Atomic.Fraction.Charge | Max.Delta.Volume | 0.0213153 |
| Max.Voltage.Step | Stability.Discharge | -0.0165552 |
| Atomic.Fraction.Discharge | Stability.Discharge | 0.0143204 |
| Max.Delta.Volume | Steps | -0.0132582 |
| Gravimetric.Capacity | Stability.Discharge | 0.0125390 |
| Max.Delta.Volume | Max.Voltage.Step | -0.0099251 |
| Max.Delta.Volume | Stability.Discharge | 0.0077357 |
| Atomic.Fraction.Charge | Max.Voltage.Step | 0.0053420 |
| Atomic.Fraction.Charge | Volumetric.Capacity | 0.0012456 |
| x | y | cor |
|---|---|---|
| Gravimetric.Energy | Volumetric.Energy | 0.9283253 |
| Gravimetric.Capacity | Volumetric.Capacity | 0.8584163 |
| Stability.Charge | Stability.Discharge | 0.8028701 |
| Atomic.Fraction.Discharge | Gravimetric.Capacity | 0.6807716 |
| Average.Voltage | Gravimetric.Energy | 0.6656523 |
Wysoka korelacja zmiennych Gravimetric.Energy i Volumetric.Energy, oraz Gravimetric.Capacity i Volumetric.Capacity wydaje się logiczna, ponieważ te pary zmiennych powiązane są z gęstością enegrii i pojemności baterii. Dla pary Stability.Charge i Stability.Discharge, wynik również jest zgodny z oczekiwaniami. Stabilość substancji w jednym stanie może być związana z jej stabilością w innym. Dwie pozostałe pary zmiennych o wysokiej korelacji (dla których ta korelacja jest już znacznie niższa) wydają się bardziej interesujące z punktu widzenia badań nad nowymi materiałami.
Najważniejszym trendem w badaniach nad bateriami wydaje się być zastosowanie litu jako głównego jonu odpowiadającego za transport ładunku. Innymi pierwiastaki często stosowanymi w tym celu są wapń i magnez, natomiast jest to znacznie rzadsze.
print(sum(grepl("O", data$Formula.Charge, ignore.case = FALSE)))
## [1] 3824
print(sum(grepl("O", data$Formula.Discharge, ignore.case = FALSE)))
## [1] 3824
Innym pierwiastkiem często używanym w materiałach do produkcji baterii jest tlen. 3848 materiałów ze zbioru zawiera go w stanie naładowanym i rozładowanym.
Ważnym celem w badaniach nad bateriami jest zwiększanie pojemości oraz gęstości energii. Na bazie uzyskanych wartości korelacji pomiędzy zmiennymi wydaje się że badania nad zwiększeniem udziału atomowego składników w stanie rozładowanym mogą mieć pozytywne skutki dla pojemności, a nad średnim napięciem dla energii.
W celu predykcji wartości Volumetric.Capacity nowych materiałów zastosowano regresor wykorzystujący algorytm Random Forest. Z danych uczących usunięto kolumny tekstowe z wyjątkiem Working.Ion, z uwagi na ich niską informatywność dla regresora - bardzo dużo liczba wartości kategorycznych. Usnięto również zmienną Gravimetric.Capacity - wysoka korelacja z Volumetric.Capacity sprawia że predykcja na jej bazie jest pozbawiona sensu.
Dane zostały podzielone na zbiór treningowy i testowy. Zbiór treningowy stanowi 70% całości zbioru. Do próbkowania zbioru danych użyto metody k-krotnej walidacji krzyżowej.
regression_columns <- setdiff(columns, c("Battery.Formula", "Formula.Charge", "Formula.Discharge", "Battery.ID", "Gravimetric.Capacity"))
source <- data[regression_columns]
idx <- createDataPartition(y = source$Volumetric.Capacity, p = 0.7, list = FALSE)
train <- source[idx,]
test <- source[-idx,]
ctrl <- trainControl(method = "repeatedcv",
number = 2, repeats = 5)
fit <- train(Volumetric.Capacity ~ .,
data = train,
method = "rf",
trControl = ctrl,
importance = TRUE,
ntree = 10)
rfClasses <- predict(fit, newdata = test)
kable(fit$results, caption="Tabela wyników z podzbioru uczącego")
| mtry | RMSE | Rsquared | MAE | RMSESD | RsquaredSD | MAESD |
|---|---|---|---|---|---|---|
| 2 | 248.2684 | 0.8473385 | 132.15075 | 23.26967 | 0.0274387 | 7.035773 |
| 10 | 158.5783 | 0.9227995 | 62.30159 | 26.63345 | 0.0292285 | 4.234356 |
| 19 | 156.9946 | 0.9254912 | 47.44303 | 23.23716 | 0.0264372 | 3.911375 |
res_pred <- postResample(pred = rfClasses, obs = test$Volumetric.Capacity)
kable(res_pred[1:2])
| x | |
|---|---|
| RMSE | 206.9230965 |
| Rsquared | 0.8760484 |
Predykcję wartości Volumetric.Capacity dla nowych baterii przeprowadzono na trzech przykładach. Zostały one przestawaione w poniższej tabeli:
new_materials <- data.frame(
Working.Ion = c("Li", "Li", "Ca"),
Max.Delta.Volume = c(3, 0.1, 0.5),
Average.Voltage = c(0.1, -0.2, 0.4),
Gravimetric.Energy = c(200, 50, 100),
Volumetric.Energy = c(600, 150, 300),
Atomic.Fraction.Charge = c(0, 0, 0.5),
Atomic.Fraction.Discharge = c(0.75, 0.8, 0.9),
Stability.Charge = c(0, 0.1, 0.05),
Stability.Discharge = c(0.01, 0.05, 0.1),
Steps = c(1, 1, 1),
Max.Voltage.Step = c(0, 0, 0)
)
predicted <- predict(fit, newdata = new_materials)
new_materials$Predicted.Volumetric.Capacity = predicted
kable(new_materials)
| Working.Ion | Max.Delta.Volume | Average.Voltage | Gravimetric.Energy | Volumetric.Energy | Atomic.Fraction.Charge | Atomic.Fraction.Discharge | Stability.Charge | Stability.Discharge | Steps | Max.Voltage.Step | Predicted.Volumetric.Capacity |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Li | 3.0 | 0.1 | 200 | 600 | 0.0 | 0.75 | 0.00 | 0.01 | 1 | 0 | 4081.459 |
| Li | 0.1 | -0.2 | 50 | 150 | 0.0 | 0.80 | 0.10 | 0.05 | 1 | 0 | 4776.475 |
| Ca | 0.5 | 0.4 | 100 | 300 | 0.5 | 0.90 | 0.05 | 0.10 | 1 | 0 | 6693.135 |